qutebrowser 脚本注入

在 Qutebrowser 中,打开新页面时,浏览器会向页面中注入 JavaScript 脚本和 CSS。注入的内容包括:quirks(对某些网站的修复脚本),css(自定义主题),Greasemonkey 脚本……

在本文中梳理脚本注入的过程。Qutebrowser 同时包括 QtWebkit 和 QWebEngine 实现,这里以后者作为分析。

打开新页面,实际指的是创建新的 WebEngineTab 实例。该类通过一个内部类 _WebEngineScripts 管理脚本注入。

WebEngineTab 在构造函数中就开始注入,调用 _WebEngineScripts 的 init 方法:

def init(self):
    """Initialize global qutebrowser JavaScript."""
    js_code = javascript.wrap_global(
        'scripts',
        resources.read_file('javascript/scroll.js'),
        resources.read_file('javascript/webelem.js'),
        resources.read_file('javascript/caret.js'),
    )
    # FIXME:qtwebengine what about subframes=True?
    self._inject_js('js', js_code, subframes=True)
    self._init_stylesheet()

    self._greasemonkey.scripts_reloaded.connect(
        self._inject_all_greasemonkey_scripts)
    self._inject_all_greasemonkey_scripts()
    self._inject_site_specific_quirks()

其中,分为几个过程:

  1. 注入 qutebrowser 的 JavaScript 脚本,这些脚本用于浏览器与页面进行交互
    1. 这里原作者也对为什么开一个 subframes 有疑问
  2. 注入 CSS,通过  shared.get_user_stylesheet() 获取用户样式表,通过 javascript/stylesheet.js 脚本实现注入
  3. 注入 greasemonkey 脚本
    1. 同时绑定一个信号槽,greasemonkey 自动重新加载
    2. greasemonkey 脚本由 GreasemonkeyManager 类负责
  4. 注入 quirks 修复脚本

本文作者:Maeiee

本文链接:qutebrowser 脚本注入

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!